
#ifndef __GPIO_H__
#define __GPIO_H__

#define GPIO_PIN_LIST(M) \
    M(GPIO_PIN_0, 0) \
    M(GPIO_PIN_1, 1) \
    M(GPIO_PIN_2, 2) \
    M(GPIO_PIN_3, 3) \
    M(GPIO_PIN_4, 4) \
    M(GPIO_PIN_5, 5) \
    M(GPIO_PIN_6, 6) \
    M(GPIO_PIN_7, 7) \
    M(GPIO_PIN_8, 8) \
    M(GPIO_PIN_9, 9) \
    M(GPIO_PIN_10, 10) \
    M(GPIO_PIN_11, 11) \
    M(GPIO_PIN_12, 12) \
    M(GPIO_PIN_13, 13) \
    M(GPIO_PIN_14, 14) \
    M(GPIO_PIN_15, 15) \
    M(GPIO_PIN_16, 16) \
    M(GPIO_PIN_17, 17) \
    M(GPIO_PIN_18, 18) \
    M(GPIO_PIN_19, 19) \
    M(GPIO_PIN_20, 20) \
    M(GPIO_PIN_21, 21) \
    M(GPIO_PIN_22, 22) \
    M(GPIO_PIN_23, 23) \
    M(GPIO_PIN_24, 24) \
    M(GPIO_PIN_25, 25) \
    M(GPIO_PIN_26, 26) \
    M(GPIO_PIN_27, 27) \
    M(GPIO_PIN_28, 28) \
    M(GPIO_PIN_29, 29) \
    M(GPIO_PIN_30, 30) \
    M(GPIO_PIN_31, 31) \
    M(GPIO_PIN_32, 32) \
    M(GPIO_PIN_33, 33) \
    M(GPIO_PIN_34, 34) \
    M(GPIO_PIN_35, 35) \
    M(GPIO_PIN_36, 36) \
    M(GPIO_PIN_37, 37) \
    M(GPIO_PIN_38, 38) \
    M(GPIO_PIN_39, 39) \
    M(GPIO_PIN_40, 40) \
    M(GPIO_PIN_41, 41) \
    M(GPIO_PIN_42, 42) \
    M(GPIO_PIN_43, 43) \
    M(GPIO_PIN_44, 44) \
    M(GPIO_PIN_45, 45) \
    M(GPIO_PIN_46, 46) \
    M(GPIO_PIN_47, 47) \
    M(GPIO_PIN_48, 48) \
    M(GPIO_PIN_49, 49) \
    M(GPIO_PIN_50, 50) \
    M(GPIO_PIN_51, 51) \
    M(GPIO_PIN_52, 52) \
    M(GPIO_PIN_53, 53) \
    M(GPIO_PIN_54, 54) \
    M(GPIO_PIN_55, 55) \
    M(GPIO_PIN_56, 56) \
    M(GPIO_PIN_57, 57) \
    M(GPIO_PIN_58, 58) \
    M(GPIO_PIN_59, 59) \
    M(GPIO_PIN_60, 60) \
    M(GPIO_PIN_61, 61) \
    M(GPIO_PIN_62, 62) \
    M(GPIO_PIN_63, 63) \
    M(GPIO_PIN_64, 64) \
    M(GPIO_PIN_65, 65) \
    M(GPIO_PIN_66, 66) \
    M(GPIO_PIN_67, 67) \
    M(GPIO_PIN_68, 68) \
    M(GPIO_PIN_69, 69) \
    M(GPIO_PIN_70, 70) \
    M(GPIO_PIN_71, 71) \
    M(GPIO_PIN_72, 72) \
    M(GPIO_PIN_73, 73) \
    M(GPIO_PIN_74, 74) \
    M(GPIO_PIN_75, 75) \
    M(GPIO_PIN_76, 76) \
    M(GPIO_PIN_77, 77) \
    M(GPIO_PIN_78, 78) \
    M(GPIO_PIN_79, 79) \
    M(GPIO_PIN_80, 80) \
    M(GPIO_PIN_81, 81) \
    M(GPIO_PIN_82, 82) \
    M(GPIO_PIN_83, 83) \
    M(GPIO_PIN_84, 84) \
    M(GPIO_PIN_85, 85) \
    M(GPIO_PIN_86, 86) \
    M(GPIO_PIN_87, 87) \
    M(GPIO_PIN_88, 88) \
    M(GPIO_PIN_89, 89) \
    M(GPIO_PIN_90, 90) \
    M(GPIO_PIN_91, 91) \
    M(GPIO_PIN_92, 92) \
    M(GPIO_PIN_93, 93) \
    M(GPIO_PIN_94, 94) \
    M(GPIO_PIN_95, 95) \
    M(GPIO_PIN_96, 96) \
    M(GPIO_PIN_97, 97) \
    M(GPIO_PIN_98, 98) \
    M(GPIO_PIN_99, 99) \
    M(GPIO_PIN_100, 100) \
    M(GPIO_PIN_101, 101) \
    M(GPIO_PIN_102, 102) \
    M(GPIO_PIN_103, 103) \
    M(GPIO_PIN_104, 104) \
    M(GPIO_PIN_105, 105) \
    M(GPIO_PIN_106, 106) \
    M(GPIO_PIN_107, 107) \
    M(GPIO_PIN_108, 108) \
    M(GPIO_PIN_109, 109) \
    M(GPIO_PIN_110, 110) \
    M(GPIO_PIN_111, 111)

#define GPIO_PIN_ENUM(e, v) e = v,

typedef enum {
    GPIO_PIN_LIST(GPIO_PIN_ENUM)
    GPIO_PIN_MAX
} gpio_pin_e;

typedef enum {
    GPIO_MODE_AIN,
    GPIO_MODE_IN_FLOATING,
    GPIO_MODE_IPD,
    GPIO_MODE_IPU,
    GPIO_MODE_OUT_OD,
    GPIO_MODE_OUT_PP,
    GPIO_MODE_AF_OD,
    GPIO_MODE_AF_PP
} gpio_mode_e;

typedef struct {
    gpio_mode_e mode;
} gpio_cfg_t;

typedef struct {
    gpio_pin_e pin;
    gpio_cfg_t cfg;
	int(*open)(gpio_cfg_t *);
	void(*write)(int);
	int(*read)(void);
	void(*deinit)(void);
} gpio_t;

extern gpio_t *gpio_init(gpio_pin_e pin);
extern gpio_t *gpio_find_by_pin(gpio_pin_e pin);

#endif
